from django.views import View
from django import http
from meid_duo.libs.captcha.captcha import captcha   #导入sdk 图形验证码第三方包
from django_redis import get_redis_connection     #导入django——redis
from meid_duo.utils.response_code import RETCODE
from random import randint
import logging
from celery_tasks.sms.tasks import send_sms_code    #  导入以搭建好的celery
# Create your views here.
logger = logging.getLogger("django")

class ImageCodeView(View):
    """图形验证码"""
    def get(self,request,uuid):

        # 利用SDK 生成图形验证码 (唯一标识字符串, 图形验证内容字符串, 二进制图片数据)
        name, text, image = captcha.generate_captcha()
        # 创建redis连接对象
        redis_conn = get_redis_connection("verify_code")
        # 将图形验证码字符串存入到reids
        redis_conn.setex('img_%s' % uuid, 300, text)
        # 把生成好的图片响应给前端
        return http.HttpResponse(image, content_type='image/png')


class SMSCodeView(View):
    """短信验证码"""
    def get(self,request,mobile):
        redis_conn = get_redis_connection("verify_code") #连接数据库
        send_flag = redis_conn.get("send_%s" % mobile)  #频繁发送短信状态记录
        if send_flag:   # 取到值则表示60s之内有发送过短信，提示用户
            return http.JsonResponse({"code":RETCODE.THROTTLINGERR,"errmsg": "频繁发送短信"})
        image_code = request.GET.get("image_code")
        uuid = request.GET.get("uuid")

        if not all([image_code,uuid]):
            return http.JsonResponse({'code': RETCODE.NECESSARYPARAMERR, 'errmsg': '缺少必传参数'})

        image_code_server = redis_conn.get("img_%s" % uuid)     #获取数据
        redis_conn.delete("img_%s" % uuid)
        if image_code_server is None or image_code.lower() != image_code_server.decode().lower():
            return http.JsonResponse({"code":RETCODE.IMAGECODEERR,"errmsg": "图形验证码错误"})

        sms_code = "%06d" % randint(0, 999999)   # 随机生成6位验证码
        logger.info(sms_code)      # 日志输出

        #管道
        # pl = redis_conn.pipeline()
        pl = redis_conn.pipeline()
        #将随机生成的6位验证码保存到数据库中
        # redis_conn.setex("sms_%s" % mobile, 300, sms_code)
        pl.setex("sms_%s" % mobile, 300, sms_code)
        # 手机号发过短信后在redis中存储一个标记
        # redis_conn.setex('send_flag_%s' % mobile, 60, 1)
        pl.setex("send_%s" % mobile, 60, 1)    # 设置60s内同一手机只能发送一条信息，和最开始的判断使用
        pl.execute()

        # 利用容联云SDK发短信
        # CCP().send_template_sms(手机号, [验证码, 提示用户验证码有效期多少分钟], 短信模板id)
        # CCP().send_template_sms(mobile, [sms_code, 5], 1)

        # 需要把CCP这行代码先加入到一个指定的仓库中，后续在单独的一个线程 进程去异步执行，不在当下去执行
        # 由生产者 往 经纪人里面存一个任务
        send_sms_code.delay(mobile, sms_code)   # 使用celery 异步
        return http.JsonResponse({"code":RETCODE.OK,"errmsg":"手机短信码以发送"})


